/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica.jpaControllers;

import Entidades.Provincia;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidades.Pais;
import Entidades.Proveedor;
import java.util.ArrayList;
import java.util.Collection;
import Entidades.Localidad;
import Entidades.Operario;
import Entidades.Transportista;
import logica.jpaControllers.exceptions.IllegalOrphanException;
import logica.jpaControllers.exceptions.NonexistentEntityException;

/**
 *
 * @author Anali
 */
public class ProvinciaJpaController {

    public ProvinciaJpaController() {
        emf = Persistence.createEntityManagerFactory("GestorPesajeJpaPU2");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Provincia provincia) {
        if (provincia.getProveedorCollection() == null) {
            provincia.setProveedorCollection(new ArrayList<Proveedor>());
        }
        if (provincia.getLocalidadCollection() == null) {
            provincia.setLocalidadCollection(new ArrayList<Localidad>());
        }
        if (provincia.getOperarioCollection() == null) {
            provincia.setOperarioCollection(new ArrayList<Operario>());
        }
        if (provincia.getTransportistaCollection() == null) {
            provincia.setTransportistaCollection(new ArrayList<Transportista>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Pais pais = provincia.getPais();
            if (pais != null) {
                pais = em.getReference(pais.getClass(), pais.getIdpais());
                provincia.setPais(pais);
            }
            Collection<Proveedor> attachedProveedorCollection = new ArrayList<Proveedor>();
            for (Proveedor proveedorCollectionProveedorToAttach : provincia.getProveedorCollection()) {
                proveedorCollectionProveedorToAttach = em.getReference(proveedorCollectionProveedorToAttach.getClass(), proveedorCollectionProveedorToAttach.getIdProveedor());
                attachedProveedorCollection.add(proveedorCollectionProveedorToAttach);
            }
            provincia.setProveedorCollection(attachedProveedorCollection);
            Collection<Localidad> attachedLocalidadCollection = new ArrayList<Localidad>();
            for (Localidad localidadCollectionLocalidadToAttach : provincia.getLocalidadCollection()) {
                localidadCollectionLocalidadToAttach = em.getReference(localidadCollectionLocalidadToAttach.getClass(), localidadCollectionLocalidadToAttach.getIdlocalidad());
                attachedLocalidadCollection.add(localidadCollectionLocalidadToAttach);
            }
            provincia.setLocalidadCollection(attachedLocalidadCollection);
            Collection<Operario> attachedOperarioCollection = new ArrayList<Operario>();
            for (Operario operarioCollectionOperarioToAttach : provincia.getOperarioCollection()) {
                operarioCollectionOperarioToAttach = em.getReference(operarioCollectionOperarioToAttach.getClass(), operarioCollectionOperarioToAttach.getIdoperario());
                attachedOperarioCollection.add(operarioCollectionOperarioToAttach);
            }
            provincia.setOperarioCollection(attachedOperarioCollection);
            Collection<Transportista> attachedTransportistaCollection = new ArrayList<Transportista>();
            for (Transportista transportistaCollectionTransportistaToAttach : provincia.getTransportistaCollection()) {
                transportistaCollectionTransportistaToAttach = em.getReference(transportistaCollectionTransportistaToAttach.getClass(), transportistaCollectionTransportistaToAttach.getIdTransportista());
                attachedTransportistaCollection.add(transportistaCollectionTransportistaToAttach);
            }
            provincia.setTransportistaCollection(attachedTransportistaCollection);
            em.persist(provincia);
            if (pais != null) {
                pais.getProvinciaCollection().add(provincia);
                pais = em.merge(pais);
            }
            for (Proveedor proveedorCollectionProveedor : provincia.getProveedorCollection()) {
                Provincia oldProvinciaOfProveedorCollectionProveedor = proveedorCollectionProveedor.getProvincia();
                proveedorCollectionProveedor.setProvincia(provincia);
                proveedorCollectionProveedor = em.merge(proveedorCollectionProveedor);
                if (oldProvinciaOfProveedorCollectionProveedor != null) {
                    oldProvinciaOfProveedorCollectionProveedor.getProveedorCollection().remove(proveedorCollectionProveedor);
                    oldProvinciaOfProveedorCollectionProveedor = em.merge(oldProvinciaOfProveedorCollectionProveedor);
                }
            }
            for (Localidad localidadCollectionLocalidad : provincia.getLocalidadCollection()) {
                Provincia oldProvinciaOfLocalidadCollectionLocalidad = localidadCollectionLocalidad.getProvincia();
                localidadCollectionLocalidad.setProvincia(provincia);
                localidadCollectionLocalidad = em.merge(localidadCollectionLocalidad);
                if (oldProvinciaOfLocalidadCollectionLocalidad != null) {
                    oldProvinciaOfLocalidadCollectionLocalidad.getLocalidadCollection().remove(localidadCollectionLocalidad);
                    oldProvinciaOfLocalidadCollectionLocalidad = em.merge(oldProvinciaOfLocalidadCollectionLocalidad);
                }
            }
            for (Operario operarioCollectionOperario : provincia.getOperarioCollection()) {
                Provincia oldProvinciaOfOperarioCollectionOperario = operarioCollectionOperario.getProvincia();
                operarioCollectionOperario.setProvincia(provincia);
                operarioCollectionOperario = em.merge(operarioCollectionOperario);
                if (oldProvinciaOfOperarioCollectionOperario != null) {
                    oldProvinciaOfOperarioCollectionOperario.getOperarioCollection().remove(operarioCollectionOperario);
                    oldProvinciaOfOperarioCollectionOperario = em.merge(oldProvinciaOfOperarioCollectionOperario);
                }
            }
            for (Transportista transportistaCollectionTransportista : provincia.getTransportistaCollection()) {
                Provincia oldProvinciaOfTransportistaCollectionTransportista = transportistaCollectionTransportista.getProvincia();
                transportistaCollectionTransportista.setProvincia(provincia);
                transportistaCollectionTransportista = em.merge(transportistaCollectionTransportista);
                if (oldProvinciaOfTransportistaCollectionTransportista != null) {
                    oldProvinciaOfTransportistaCollectionTransportista.getTransportistaCollection().remove(transportistaCollectionTransportista);
                    oldProvinciaOfTransportistaCollectionTransportista = em.merge(oldProvinciaOfTransportistaCollectionTransportista);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Provincia provincia) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Provincia persistentProvincia = em.find(Provincia.class, provincia.getIdprovincia());
            Pais paisOld = persistentProvincia.getPais();
            Pais paisNew = provincia.getPais();
            Collection<Proveedor> proveedorCollectionOld = persistentProvincia.getProveedorCollection();
            Collection<Proveedor> proveedorCollectionNew = provincia.getProveedorCollection();
            Collection<Localidad> localidadCollectionOld = persistentProvincia.getLocalidadCollection();
            Collection<Localidad> localidadCollectionNew = provincia.getLocalidadCollection();
            Collection<Operario> operarioCollectionOld = persistentProvincia.getOperarioCollection();
            Collection<Operario> operarioCollectionNew = provincia.getOperarioCollection();
            Collection<Transportista> transportistaCollectionOld = persistentProvincia.getTransportistaCollection();
            Collection<Transportista> transportistaCollectionNew = provincia.getTransportistaCollection();
            List<String> illegalOrphanMessages = null;
            for (Proveedor proveedorCollectionOldProveedor : proveedorCollectionOld) {
                if (!proveedorCollectionNew.contains(proveedorCollectionOldProveedor)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Proveedor " + proveedorCollectionOldProveedor + " since its provincia field is not nullable.");
                }
            }
            for (Localidad localidadCollectionOldLocalidad : localidadCollectionOld) {
                if (!localidadCollectionNew.contains(localidadCollectionOldLocalidad)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Localidad " + localidadCollectionOldLocalidad + " since its provincia field is not nullable.");
                }
            }
            for (Operario operarioCollectionOldOperario : operarioCollectionOld) {
                if (!operarioCollectionNew.contains(operarioCollectionOldOperario)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Operario " + operarioCollectionOldOperario + " since its provincia field is not nullable.");
                }
            }
            for (Transportista transportistaCollectionOldTransportista : transportistaCollectionOld) {
                if (!transportistaCollectionNew.contains(transportistaCollectionOldTransportista)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Transportista " + transportistaCollectionOldTransportista + " since its provincia field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (paisNew != null) {
                paisNew = em.getReference(paisNew.getClass(), paisNew.getIdpais());
                provincia.setPais(paisNew);
            }
            Collection<Proveedor> attachedProveedorCollectionNew = new ArrayList<Proveedor>();
            for (Proveedor proveedorCollectionNewProveedorToAttach : proveedorCollectionNew) {
                proveedorCollectionNewProveedorToAttach = em.getReference(proveedorCollectionNewProveedorToAttach.getClass(), proveedorCollectionNewProveedorToAttach.getIdProveedor());
                attachedProveedorCollectionNew.add(proveedorCollectionNewProveedorToAttach);
            }
            proveedorCollectionNew = attachedProveedorCollectionNew;
            provincia.setProveedorCollection(proveedorCollectionNew);
            Collection<Localidad> attachedLocalidadCollectionNew = new ArrayList<Localidad>();
            for (Localidad localidadCollectionNewLocalidadToAttach : localidadCollectionNew) {
                localidadCollectionNewLocalidadToAttach = em.getReference(localidadCollectionNewLocalidadToAttach.getClass(), localidadCollectionNewLocalidadToAttach.getIdlocalidad());
                attachedLocalidadCollectionNew.add(localidadCollectionNewLocalidadToAttach);
            }
            localidadCollectionNew = attachedLocalidadCollectionNew;
            provincia.setLocalidadCollection(localidadCollectionNew);
            Collection<Operario> attachedOperarioCollectionNew = new ArrayList<Operario>();
            for (Operario operarioCollectionNewOperarioToAttach : operarioCollectionNew) {
                operarioCollectionNewOperarioToAttach = em.getReference(operarioCollectionNewOperarioToAttach.getClass(), operarioCollectionNewOperarioToAttach.getIdoperario());
                attachedOperarioCollectionNew.add(operarioCollectionNewOperarioToAttach);
            }
            operarioCollectionNew = attachedOperarioCollectionNew;
            provincia.setOperarioCollection(operarioCollectionNew);
            Collection<Transportista> attachedTransportistaCollectionNew = new ArrayList<Transportista>();
            for (Transportista transportistaCollectionNewTransportistaToAttach : transportistaCollectionNew) {
                transportistaCollectionNewTransportistaToAttach = em.getReference(transportistaCollectionNewTransportistaToAttach.getClass(), transportistaCollectionNewTransportistaToAttach.getIdTransportista());
                attachedTransportistaCollectionNew.add(transportistaCollectionNewTransportistaToAttach);
            }
            transportistaCollectionNew = attachedTransportistaCollectionNew;
            provincia.setTransportistaCollection(transportistaCollectionNew);
            provincia = em.merge(provincia);
            if (paisOld != null && !paisOld.equals(paisNew)) {
                paisOld.getProvinciaCollection().remove(provincia);
                paisOld = em.merge(paisOld);
            }
            if (paisNew != null && !paisNew.equals(paisOld)) {
                paisNew.getProvinciaCollection().add(provincia);
                paisNew = em.merge(paisNew);
            }
            for (Proveedor proveedorCollectionNewProveedor : proveedorCollectionNew) {
                if (!proveedorCollectionOld.contains(proveedorCollectionNewProveedor)) {
                    Provincia oldProvinciaOfProveedorCollectionNewProveedor = proveedorCollectionNewProveedor.getProvincia();
                    proveedorCollectionNewProveedor.setProvincia(provincia);
                    proveedorCollectionNewProveedor = em.merge(proveedorCollectionNewProveedor);
                    if (oldProvinciaOfProveedorCollectionNewProveedor != null && !oldProvinciaOfProveedorCollectionNewProveedor.equals(provincia)) {
                        oldProvinciaOfProveedorCollectionNewProveedor.getProveedorCollection().remove(proveedorCollectionNewProveedor);
                        oldProvinciaOfProveedorCollectionNewProveedor = em.merge(oldProvinciaOfProveedorCollectionNewProveedor);
                    }
                }
            }
            for (Localidad localidadCollectionNewLocalidad : localidadCollectionNew) {
                if (!localidadCollectionOld.contains(localidadCollectionNewLocalidad)) {
                    Provincia oldProvinciaOfLocalidadCollectionNewLocalidad = localidadCollectionNewLocalidad.getProvincia();
                    localidadCollectionNewLocalidad.setProvincia(provincia);
                    localidadCollectionNewLocalidad = em.merge(localidadCollectionNewLocalidad);
                    if (oldProvinciaOfLocalidadCollectionNewLocalidad != null && !oldProvinciaOfLocalidadCollectionNewLocalidad.equals(provincia)) {
                        oldProvinciaOfLocalidadCollectionNewLocalidad.getLocalidadCollection().remove(localidadCollectionNewLocalidad);
                        oldProvinciaOfLocalidadCollectionNewLocalidad = em.merge(oldProvinciaOfLocalidadCollectionNewLocalidad);
                    }
                }
            }
            for (Operario operarioCollectionNewOperario : operarioCollectionNew) {
                if (!operarioCollectionOld.contains(operarioCollectionNewOperario)) {
                    Provincia oldProvinciaOfOperarioCollectionNewOperario = operarioCollectionNewOperario.getProvincia();
                    operarioCollectionNewOperario.setProvincia(provincia);
                    operarioCollectionNewOperario = em.merge(operarioCollectionNewOperario);
                    if (oldProvinciaOfOperarioCollectionNewOperario != null && !oldProvinciaOfOperarioCollectionNewOperario.equals(provincia)) {
                        oldProvinciaOfOperarioCollectionNewOperario.getOperarioCollection().remove(operarioCollectionNewOperario);
                        oldProvinciaOfOperarioCollectionNewOperario = em.merge(oldProvinciaOfOperarioCollectionNewOperario);
                    }
                }
            }
            for (Transportista transportistaCollectionNewTransportista : transportistaCollectionNew) {
                if (!transportistaCollectionOld.contains(transportistaCollectionNewTransportista)) {
                    Provincia oldProvinciaOfTransportistaCollectionNewTransportista = transportistaCollectionNewTransportista.getProvincia();
                    transportistaCollectionNewTransportista.setProvincia(provincia);
                    transportistaCollectionNewTransportista = em.merge(transportistaCollectionNewTransportista);
                    if (oldProvinciaOfTransportistaCollectionNewTransportista != null && !oldProvinciaOfTransportistaCollectionNewTransportista.equals(provincia)) {
                        oldProvinciaOfTransportistaCollectionNewTransportista.getTransportistaCollection().remove(transportistaCollectionNewTransportista);
                        oldProvinciaOfTransportistaCollectionNewTransportista = em.merge(oldProvinciaOfTransportistaCollectionNewTransportista);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = provincia.getIdprovincia();
                if (findProvincia(id) == null) {
                    throw new NonexistentEntityException("The provincia with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Provincia provincia;
            try {
                provincia = em.getReference(Provincia.class, id);
                provincia.getIdprovincia();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The provincia with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Proveedor> proveedorCollectionOrphanCheck = provincia.getProveedorCollection();
            for (Proveedor proveedorCollectionOrphanCheckProveedor : proveedorCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Provincia (" + provincia + ") cannot be destroyed since the Proveedor " + proveedorCollectionOrphanCheckProveedor + " in its proveedorCollection field has a non-nullable provincia field.");
            }
            Collection<Localidad> localidadCollectionOrphanCheck = provincia.getLocalidadCollection();
            for (Localidad localidadCollectionOrphanCheckLocalidad : localidadCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Provincia (" + provincia + ") cannot be destroyed since the Localidad " + localidadCollectionOrphanCheckLocalidad + " in its localidadCollection field has a non-nullable provincia field.");
            }
            Collection<Operario> operarioCollectionOrphanCheck = provincia.getOperarioCollection();
            for (Operario operarioCollectionOrphanCheckOperario : operarioCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Provincia (" + provincia + ") cannot be destroyed since the Operario " + operarioCollectionOrphanCheckOperario + " in its operarioCollection field has a non-nullable provincia field.");
            }
            Collection<Transportista> transportistaCollectionOrphanCheck = provincia.getTransportistaCollection();
            for (Transportista transportistaCollectionOrphanCheckTransportista : transportistaCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Provincia (" + provincia + ") cannot be destroyed since the Transportista " + transportistaCollectionOrphanCheckTransportista + " in its transportistaCollection field has a non-nullable provincia field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Pais pais = provincia.getPais();
            if (pais != null) {
                pais.getProvinciaCollection().remove(provincia);
                pais = em.merge(pais);
            }
            em.remove(provincia);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Provincia> findProvinciaEntities() {
        return findProvinciaEntities(true, -1, -1);
    }

    public List<Provincia> findProvinciaEntities(int maxResults, int firstResult) {
        return findProvinciaEntities(false, maxResults, firstResult);
    }

    private List<Provincia> findProvinciaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Provincia as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Provincia findProvincia(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Provincia.class, id);
        } finally {
            em.close();
        }
    }

    public int getProvinciaCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Provincia as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    public Provincia findProvincia_x_nombre(String nom) {
           EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select u from Provincia u where u.nombreprovincia = " + "'" + nom +"'");
            return (Provincia) q.getSingleResult();
        } finally {
            em.close();
        }
    }

}
